home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ For TASM / ASMWIN.PAK / ASMWIN.ASM next >
Assembly Source File  |  1996-02-21  |  7KB  |  215 lines

  1. LOCALS
  2. .MODEL LARGE, WINDOWS PASCAL
  3. .286
  4.  
  5. INCLUDE WINDOWS.INC
  6.  
  7. extrn   INITTASK:PROC
  8. extrn   WAITEVENT:PROC
  9. extrn   INITAPP:PROC
  10. extrn   REGISTERCLASS:PROC
  11. extrn   MESSAGEBOX:PROC
  12. extrn   GETSTOCKOBJECT:PROC
  13. extrn   LOADCURSOR:PROC
  14. extrn   CREATEWINDOW:PROC
  15. extrn   SHOWWINDOW:PROC
  16. extrn   UPDATEWINDOW:PROC
  17. extrn   GETMESSAGE:PROC
  18. extrn   TRANSLATEMESSAGE:PROC
  19. extrn   DISPATCHMESSAGE:PROC
  20. extrn   POSTQUITMESSAGE:PROC
  21. extrn   DEFWINDOWPROC:PROC
  22. extrn   BEGINPAINT:PROC
  23. extrn   ENDPAINT:PROC
  24. extrn   INVALIDATERECT:PROC
  25. extrn   TEXTOUT:PROC
  26.  
  27. .DATA
  28.             db    16 dup( 0 ) ; Required for Task Header!!
  29. psp         dw       ?
  30. pszCmdline  dw       ?
  31. hPrev       dw       ?
  32. hInstance   dw       ?
  33. nCmdShow    dw       ?
  34. hdc         dw       ?
  35.  
  36. hwndMain    dw       0
  37. ps          PAINTSTRUCT <0>
  38. msg         MSGSTRUCT   <0>
  39. wc          WNDCLASS    <0>
  40.  
  41.  
  42. szTitleName     db  'Sample Windows App',0
  43. szClassName     db  "$un$Peu$d'Assemblage$",0
  44. szSalute        db  'Welcome to Windows from Assembly: Press LButton'
  45. szSaluteEnd     LABEL byte      ; Not NULL terminated !!
  46. szLButtonDown   db  'Left Button down',0
  47. szInfo          db  'Info',0
  48.  
  49. .CODE
  50.  
  51. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
  52. InitApplication     PROC
  53.             ;; initialize the WndClass structure
  54.             mov    wc.clsStyle, CS_HREDRAW+CS_VREDRAW
  55.             mov    word ptr wc.clsLpfnWndProc, OFFSET WndProc
  56.             mov    word ptr wc.clsLpfnWndProc+2, SEG WndProc
  57.             mov    wc.clsCbClsExtra, 0
  58.             mov    wc.clsCbWndExtra, 0
  59.             mov    ax, hInstance
  60.             mov    wc.clsHInstance, ax
  61.             mov    wc.clsHIcon, 0
  62.  
  63.             xor    ax, ax
  64.             call   LoadCursor PASCAL, ax, ax, IDI_APPLICATION
  65.             mov    wc.clsHCursor, ax
  66.  
  67.             call   GetStockObject PASCAL, WHITE_BRUSH
  68.             mov    wc.clsHbrBackground, ax
  69.  
  70.             mov    word ptr wc.clsLpszMenuName, 0
  71.             mov    word ptr wc.clsLpszMenuName+2, 0
  72.  
  73.             mov    word ptr wc.clsLpszClassName, OFFSET szClassName
  74.             mov    word ptr wc.clsLpszClassName+2, ds
  75.  
  76.             call   RegisterClass PASCAL, DS, OFFSET wc                
  77.             ret
  78. ENDP
  79.  
  80.  
  81. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
  82. Start:
  83. ;Windows initialization.  Sets up registers and stack.
  84.  
  85.             ;INITTASK returns:
  86.             ;  'Failure:
  87.             ;    AX = zero if it failed
  88.             ;  Success:
  89.             ;    AX = 1
  90.             ;    CX = stack limit
  91.             ;    DX = cmdShow parameter to CreateWindow
  92.             ;    ES:BX = -> DOS format command line (ES = PSP address)
  93.             ;    SI = hPrevinstance
  94.             ;    DI = hinstance
  95.             call    INITTASK
  96.             or      ax,ax
  97.             jnz     @@OK
  98.             jmp     @@Fail
  99.  
  100. @@OK:       mov     psp, es
  101.             mov     word ptr pszCmdline, bx
  102.             mov     hPrev, si
  103.             mov     hInstance, di
  104.             mov     nCmdShow, dx
  105.  
  106. ;Initialize the Windows App
  107.             xor     ax,ax
  108.             call    WAITEVENT PASCAL, ax
  109.             call    INITAPP   PASCAL, hInstance
  110.             or      ax,ax
  111.             jnz     @@InitOK
  112.  
  113. @@Fail:     mov     ax, 4CFFh
  114.             int     21h          ; terminate program
  115.  
  116. @@InitOK:   cmp     hPrev, 0
  117.             jne     @@RegOK
  118.             call    InitApplication
  119.             or      ax, ax
  120.             jz      @@Fail
  121.  
  122. @@RegOK:    xor     ax, ax
  123.             mov     bx, CW_USEDEFAULT
  124.             call    CreateWindow PASCAL, DS OFFSET szClassName, DS,\
  125.                     OFFSET szTitleName,                            \
  126.                     WS_OVERLAPPEDWINDOW+WS_VISIBLE, ax,            \
  127.                     bx, bx, bx, bx, ax, ax, hInstance, ax, ax
  128.             mov     hwndMain, ax
  129.             call    ShowWindow PASCAL, ax, nCmdShow
  130.             call    UpdateWindow PASCAL, hwndMain
  131.  
  132. @@MsgLoop:  call    GetMessage PASCAL, DS, OFFSET msg, 0, 0, 0
  133.             or      ax, ax
  134.             jz      @@End
  135.             call    TranslateMessage PASCAL, DS, OFFSET msg
  136.             call    DispatchMessage PASCAL, DS, OFFSET msg
  137.             jmp     @@MsgLoop
  138.  
  139. @@End:      mov     ax, msg.msWPARAM
  140.             mov     ah, 4Ch
  141.             int     21h
  142.  
  143.  
  144. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
  145. .DATA
  146. MSGINFO STRUC
  147.         MsgValue    dw  0
  148.         MsgHandler  dw  0
  149. MSGINFO ENDS
  150.  
  151.  
  152. .CODE
  153. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
  154. PaintHandler  PROC   PASCAL NEAR hwnd:WORD, wParam:WORD, lParam:DWORD
  155.             call    BeginPaint PASCAL, hwnd, DS, OFFSET ps
  156.             mov     hdc, ax
  157.             mov     bx, 10
  158.             mov     cx, OFFSET szSaluteEnd
  159.             sub     cx, OFFSET szSalute
  160.             call    TextOut PASCAL, hdc, bx, bx, DS, OFFSET szSalute, cx
  161.             call    EndPaint PASCAL, hwnd, DS, OFFSET ps
  162.             ret
  163. ENDP
  164.  
  165. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
  166. LButtonDownHandler  PROC   PASCAL NEAR hwnd:WORD, wParam:WORD, lParam:DWORD
  167.             call    MessageBox PASCAL, hwnd, DS, OFFSET szLButtonDown, \
  168.                     DS, OFFSET szInfo, MB_OK     
  169.             ret
  170. ENDP
  171.  
  172. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
  173. DestroyHandler  PROC PASCAL NEAR hwnd:WORD, wParam:WORD, lParam:DWORD
  174.             call    PostQuitMessage PASCAL, 0
  175.             ret
  176. ENDP
  177.  
  178.  
  179. .DATA
  180. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
  181. MessageTableHandler LABEL MSGINFO
  182.         MSGINFO     <WM_PAINT,  OFFSET PaintHandler>
  183.         MSGINFO     <WM_DESTROY,OFFSET DestroyHandler>
  184.         MSGINFO     <WM_LBUTTONDOWN, OFFSET LButtonDownHandler>
  185.         MSGINFO     <0,0>      ;Flags end of table         
  186.  
  187.  
  188. .CODE
  189. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
  190. WndProc PROC WINDOWS PASCAL FAR hwnd:WORD,   winMsg:WORD, \ 
  191.                                 wParam:WORD, lParam:DWORD
  192.             USES    si
  193.             mov     si, OFFSET MessageTableHandler
  194. @@LookUp:   mov     ax, [si.MsgValue]
  195.             or      ax, ax
  196.             jz      @@Def
  197.             cmp     ax, winMsg
  198.             je      @@Dispatch
  199.             add     si, SIZE MsgInfo
  200.             jmp     @@LookUp
  201.  
  202. @@Dispatch: call    [si.MsgHandler] PASCAL, hwnd, wParam, lParam
  203.             mov     ax, 0
  204.             mov     dx, 0
  205.             ret
  206.  
  207. @@Def:      call    DefWindowProc  PASCAL, hwnd, winMsg, wParam, lParam
  208.             ret
  209. WndProc     ENDP
  210.  
  211.  
  212. PUBLICDLL   WndProc
  213. END         Start
  214.  
  215.